#include "gkbaseusart.h"

GK_USARTIDLE_TYPE GKU1;
GK_USARTIDLE_TYPE GKU2;

uint8_t GK_usart_init(GK_USARTIDLE_TYPE *myuart,uint8_t usartid)
{
	switch(usartid)//绑定关系
	{
		case 1:myuart->huart=&huart1;break;
		case 2:myuart->huart=&huart2;break;
		//case 3:myuart->huart=&huart3;break;
		default :return 0;	
	}
	HAL_UART_Receive_DMA(myuart->huart, myuart->rxBuf, RECEIVELEN);//确定DMA搬运收货地址
	__HAL_UART_ENABLE_IT(myuart->huart, UART_IT_IDLE);//开启空闲中断
	__HAL_UART_CLEAR_IDLEFLAG(myuart->huart);//优化代码：马上清除一次 防止第一次误报
	return 1;
}


//拉起函数：//如果这个函数是写死的回调函数 我希望用我自己的结构体的话那就必须containof技术 现在这个函数本来就是我捏造的 我可以自己修改
void GK_UsartReceive_IDLE(GK_USARTIDLE_TYPE  *myuart)
{
	uint32_t temp;//if(myuart->huart->Instance==USART1)

	if((__HAL_UART_GET_FLAG(myuart->huart,UART_FLAG_IDLE) != RESET))
	{ 
		__HAL_UART_CLEAR_IDLEFLAG(myuart->huart);
		HAL_UART_DMAStop(myuart->huart);


		temp = myuart->huart->hdmarx->Instance->CNDTR;
		myuart->rx_len =  RECEIVELEN - temp; 
		myuart->rx_flag=1;//拉起
		//printf("::DMA::%s\r\n",myuart->rxBuf);

		
		HAL_UART_Receive_DMA(myuart->huart,myuart->rxBuf,RECEIVELEN);//再次启动DMA接收啦 所以我DMA不是循环模式而是普通模式
	}
}

uint8_t GK_usart_TXRX(GK_USARTIDLE_TYPE  *myuart, uint8_t *TX ,uint16_t TXlen ,uint8_t *RX,uint16_t *RXlen)
{
	uint8_t Cnt = 10;
	HAL_UART_Transmit(myuart->huart, TX, TXlen, 0xFFFF);
	while(Cnt--)//尝试次数 10次   这里面其实需要喂狗 每次这样的情形都有喂狗
	{
		if(myuart->rx_flag)//在中断拉起1
		{
		  memcpy(RX,myuart->rxBuf,myuart->rx_len);
			*RXlen=myuart->rx_len;
			memset(&myuart->rxBuf,0,RECEIVELEN);//用完就毁灭清为0
			myuart->rx_flag=0;
			return 1;
		}
		HAL_Delay(10);
	}
	return 0;    
}

void GK_usart_clear(GK_USARTIDLE_TYPE *myuart)
{
	myuart->rx_flag=0;
	myuart->rx_len=0;
	memset(myuart->rxBuf,0,sizeof(myuart->rxBuf));
}
